#include "func.h"


/////////////funcoes de erro/////////////////////////////
//funcao que tira o os espacos do vetor str de tamanho n 
void str_spaces(char *str, int n)
{

  char *str1;  
  int i=0, j=0;
	 
   //o tamanho da string sera	  
  str1 = (char*)malloc(sizeof(char)*n);
  
  while(str[i]!='\0')
  {
    //retira cada duplo ou mais espacos entre palavras e arruma a string numa nova string
    if(j==0)
      while(j==0 && str[i]==' ')
        i++;
    if(str[i]==' ' && str[i+1]==' ')
	    ++i;
    else
		{
		  str1[j]=str[i];
		  j++;
		  i++;
    }
	}
	//insere \0 no final da string para poder utilizar funcoes para string
  if(str1[j-1]==' ')
  	str1[j-1]='\0';
  else
    str1[j]='\0';
  strcpy(str, str1);
    return;
}

//se achar erro retorna 1
int verificaCurso(char *str){

char* aux;
int i;
aux = str;

for(i=0;i<2;i++){

	if(isdigit(str[i]) == 0){
			printf("Erro! O Curso deve possuir somente caracteres numericos ou existe caractere faltando\n");
			return 1;
	}
	
}

str = aux;

return 0;

}
//se achar erro retorna 1
int verificaNome (char *str, int n)
{

    char* aux;
    int i=0, t=0;
//se for numero ou letra retorna naum 0
	
	aux = str;
	for (i=0;i<n;i++)
	{
		if(str[i] !='.')
		if(isspace(str[i])==0)//eh espaco se for dif 0
			if (isalnum(str[i])==0) //tem pelo menos um caractere especial
			{
				str = aux;
				printf ("Campo em formato nao padrao\n");
				return 1;
			}
	}
	for(i=0;i<n;i++)
		if(str[i]!=' ')
		{
			str = aux;
			return 0;
		}
	str=aux;
	return 1;
}

//se tiver erro, retorna 1
int verificaRA(char *str){

char* aux;
int i;
aux = str;

for(i=0;i<6;i++){

	if(isdigit(str[i]) == 0){
			printf("Erro! O RA deve possuir somente caracteres numericos ou existem numeros faltando\n");
			return 1;
	}
	
}

str = aux;

return 0;

}


//se der errado,retorna 1
int verificaSexo (char *str)
{
    char* aux;
    
    aux = str;
    
    if (str[0] == ' ')
	{
	    str = aux;
	    return 0;
	}
    if (str[0] == 'M' || str[0] == 'm')
	{
	    str = aux;
	    return 0;
	}
    if (str[0] == 'F' || str[0] == 'f')
	{
	    str = aux;
	    return 0;
	}
    else 
    {
	printf ("campo sexo invalido\n");
	str = aux;
	return 1;
    }
}

//se der errado, retorna 1
/*int verificaFIM (char *str)
{
    char* aux;
    
    aux = str;
    
    if (str[0] == '#')
	{
	    str = aux;
	    return 0;
    else 
    {
	printf ("campo sexo invalido\n");
	str = aux;
	return 1;
    }
}
*/
//////////////////////////////////////////////////////////
int GERA_ARQ_COM_SEPARADOR(cad strut, char*arq_saida)
{
  FILE *new_file;
  new_file = fopen(arq_saida, "a+");
  if (new_file==NULL)
  {
    printf(ferro);
    fclose (new_file);
    return 0;
  }

  else{
//ra
    fputs (strut->sra, new_file);
    fputs (bar, new_file);

//nome
    fputs (strut->snome, new_file);
    fputs (bar, new_file);
    if(strlen(strut->scidade)!=0)
    {
//cidade      
      fputs (strut->scidade, new_file);
      fputs (bar, new_file);
      }
    else
      fputs (bar, new_file);
    if(strlen(strut->stel)!=0)
    {
//tel
      fputs (strut->stel, new_file);
      fputs (bar, new_file);
    }
    else
      fputs (bar, new_file);    
    
    if(strlen(strut->stel_alt)!=0)
    {
//tel_alt
      fputs (strut->stel_alt, new_file);
      fputs (bar, new_file);
    }
    else
      fputs (bar, new_file);
//sexo
    fputs (strut->ssexo, new_file);
    fputs (bar, new_file);
//curso
    fputs (strut->scurso, new_file);
    fputs (bar, new_file);
//#
    fputs (fim, new_file);
    fputs (lf, new_file);
  }
  fclose (new_file);
  return 1;
}


void abre_arquivo(char *arq_entrada, char* arq_saida)
{
  FILE *ap_file, *new_file;
  int i=0,t=0,func, verifica=0;
  cad pessoa, aux;
  pessoa = (cad)malloc(sizeof(cadastro));
  
  ap_file = fopen(arq_entrada, "r+");
  if (ap_file==NULL)
  {
    printf(ferro);
    fclose (ap_file);
    return;
  }
  fseek(ap_file, 0, SEEK_END);
  t = ftell(ap_file);
  printf ("tamanho do arquivo %d bytes\n", t);
  fseek(ap_file,0 , SEEK_SET);
  //numero de registros
  t = t / linha;
  printf ("numero de cadastros %d\n", t);
  

  while(i<t)
  {
    aux = pessoa;
//ra
    fgets (pessoa->sra, ra, ap_file); 
    fseek(ap_file,1, SEEK_CUR);
//nome
    fgets (pessoa->snome, nome, ap_file);
//cidade
    fgets (pessoa->scidade, cidade, ap_file); 
//tel
    fgets (pessoa->stel, tel, ap_file); 
    fseek(ap_file,1, SEEK_CUR);
//tel_alt
    fgets (pessoa->stel_alt, tel_alt, ap_file); 
    fseek(ap_file,1, SEEK_CUR);
//sexo
    fgets (pessoa->ssexo, sexo, ap_file); 
    fseek(ap_file,1, SEEK_CUR);
//curso
    fgets (pessoa->scurso, curso, ap_file); 

    pessoa->sra[6]='\0';
    pessoa->snome[24]='\0';
    pessoa->scidade[15]='\0';
    pessoa->stel[8]='\0';
    pessoa->stel_alt[8]='\0';
    pessoa->ssexo[1]='\0';
    pessoa->scurso[2]='\0';

//funcao de arrumar a struct AQUI
	verifica = verificaRA(pessoa->sra);
	if(verifica)
	{
		i++;    fseek(ap_file,3, SEEK_CUR);

		continue;
	}
	verifica = verificaNome(pessoa->snome, strlen(pessoa->snome));
	if(verifica)
	{
		i++;    fseek(ap_file,3, SEEK_CUR);
		continue;
	}
	verifica = verificaSexo(pessoa->ssexo);
	if(verifica ==1)
	{
		i++;    fseek(ap_file,3, SEEK_CUR);
		continue;
	}
	verifica = verificaCurso(pessoa->scurso);
	if(verifica ==1)
	{
		i++;    fseek(ap_file,3, SEEK_CUR);
		continue;
	}


str_spaces (pessoa->snome, nome);
str_spaces (pessoa->scidade, cidade);
str_spaces (pessoa->stel, tel);
str_spaces (pessoa->stel_alt, tel_alt);

//insere no arquivo de saida
    func=GERA_ARQ_COM_SEPARADOR(pessoa, arq_saida);
    if(func==0){
      printf(ferro);
    }
    fseek(ap_file,3, SEEK_CUR);
    i++;
  }
  fclose(ap_file);
    return ;
}

void abre_arquivo2(char *arq_entrada, char* arq_saida)
{
  FILE *ap_file, *new_file;
  int i=0,t=0,func;
  cad pessoa;
  pessoa = (cad)malloc(sizeof(cadastro));
  
  ap_file = fopen(arq_entrada, "r+");
  if (ap_file==NULL)
  {
    printf(ferro);
    fclose (ap_file);
    return;
  }
  fseek(ap_file, 0, SEEK_END);
  t = ftell(ap_file);

  fseek(ap_file,0 , SEEK_SET);
  //numero de registros
  t = t / linha;

  

  while(i<t)
  {
//ra
    fgets (pessoa->sra, ra, ap_file); 
    fseek(ap_file,1, SEEK_CUR);
//nome
    fgets (pessoa->snome, nome, ap_file); 
//cidade
    fgets (pessoa->scidade, cidade, ap_file); 
//tel
    fgets (pessoa->stel, tel, ap_file); 
    fseek(ap_file,1, SEEK_CUR);
//tel_alt
    fgets (pessoa->stel_alt, tel_alt, ap_file); 
    fseek(ap_file,1, SEEK_CUR);
//sexo
    fgets (pessoa->ssexo, sexo, ap_file); 
    fseek(ap_file,1, SEEK_CUR);
//curso
    fgets (pessoa->scurso, curso, ap_file); 

    pessoa->sra[6]='\0';
    pessoa->snome[24]='\0';
    pessoa->scidade[15]='\0';
    pessoa->stel[8]='\0';
    pessoa->stel_alt[8]='\0';
    pessoa->ssexo[1]='\0';
    pessoa->scurso[2]='\0';


//funcao de arrumar a struct AQUI
verificaRA(pessoa->sra);
verificaNome(pessoa->snome, nome);
verificaSexo(pessoa->ssexo);
verificaCurso(pessoa->scurso);

//insere no arquivo de saida
    func=GERA_ARQ_COM_SEPARADOR(pessoa, arq_saida);
    if(func==0){
      printf(ferro);
    }
    fseek(ap_file,3, SEEK_CUR);
    i++;
  }
    
  fclose(ap_file);
  return ;
}

void GERA_ARQ_COMPACTO(FILE *f, char *input)
{
	char *aux;
	char *str = (char*)malloc(sizeof(char)*100);
	int i=1;
	 FILE *fout = fopen(input, "w");
	 fgets(str, 100, f);
	while(!feof(f))
	{
		aux = strtok(str, bar);
		str_spaces(aux, strlen(aux));
		fprintf(fout, "<%d><%d>%s", strlen(aux), i, aux);
		i++;
		aux = strtok(NULL, bar);
		str_spaces(aux, strlen(aux));
		fprintf(fout, "<%d><%d>%s", strlen(aux), i, aux);
		i++;
		aux = strtok(NULL, bar);
		str_spaces(aux, strlen(aux));
		fprintf(fout, "<%d><%d>%s", strlen(aux), i, aux);
		i++;
		aux = strtok(NULL, bar);
		str_spaces(aux, strlen(aux));
		fprintf(fout, "<%d><%d>%s", strlen(aux), i, aux);
		i++;
		aux = strtok(NULL, bar);
		str_spaces(aux, strlen(aux));
		fprintf(fout, "<%d><%d>%s", strlen(aux), i, aux);
		i++;
		aux = strtok(NULL, bar);
		str_spaces(aux, strlen(aux));
		fprintf(fout, "<%d><%d>%s", strlen(aux), i, aux);
		i++;
		aux = strtok(NULL, "|");
		str_spaces(aux, strlen(aux));
		fprintf(fout, "<%d><%d>%s", strlen(aux), i, aux);
		fprintf(fout,"#");
		fgets(str, 100, f);
		fflush(fout);
		i=1;
	}
		fclose(fout);
}

